(*
  Copyright (c) 2009 Barry Schwartz

  Permission is hereby granted, free of charge, to any person
  obtaining a copy of this software and associated documentation
  files (the "Software"), to deal in the Software without
  restriction, including without limitation the rights to use,
  copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the
  Software is furnished to do so, subject to the following
  conditions:

  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  OTHER DEALINGS IN THE SOFTWARE.
*)

type num (* with sexp *)

val description : string
val module_name : string

val num_zero : num
val num_one : num
val num_minus_one : num
val num_two : num
val num_three : num
val num_ten : num
val add_num : num -> num -> num
val minus_num : num -> num
val sub_num : num -> num -> num
val mult_num : num -> num -> num
val square_num : num -> num
val div_num : num -> num -> num
val quo_num : num -> num -> num
val mod_num : num -> num -> num
val power_num : num -> num -> num
val abs_num : num -> num
val succ_num : num -> num
val pred_num : num -> num
val incr_num : num ref -> unit
val decr_num : num ref -> unit
val is_integer_num : num -> bool
val integer_num : num -> num
val floor_num : num -> num
val round_num : num -> num
val ceiling_num : num -> num
val sign_num : num -> int
val eq_num : num -> num -> bool
val lt_num : num -> num -> bool
val le_num : num -> num -> bool
val gt_num : num -> num -> bool
val ge_num : num -> num -> bool
val compare_num : num -> num -> int
val max_num : num -> num -> num
val min_num : num -> num -> num
val land_num : num -> num -> num
val lor_num : num -> num -> num
val lxor_num : num -> num -> num
val lneg_num : num -> num
val string_of_num : num -> string
val num_of_string : string -> num
val int_of_num : num -> int
val num_of_int : int -> num
val num_of_ints : int -> int -> num
val float_of_num : num -> float
val num_of_float : float -> num
val serialise_num : (char -> unit) -> num -> unit
val unserialise_num : (unit -> char) -> num

val pythonize_num   : num -> Pycaml.pyobject
val unpythonize_num : Pycaml.pyobject -> num
